#!/bin/sh

MODNAME=l2fw
MODCHAIN="mod_$MODNAME"
IT_LIST="/sbin/iptables /sbin/ip6tables"

add_chain() {
  for IT in $IT_LIST; do
    [ -x $IT ] || continue
    IPT="$IT -t mangle"
    $IPT -N $MODCHAIN || continue
    I=0
    while true; do
      I=$((I+1))
      PREFIX=MOD_L2FW_RULE${I}
      eval ENABLED='$'${PREFIX}_ENABLED
      [ -z $ENABLED ] && break
      [ $ENABLED = 1 ] || continue
      eval MACADDR='$'${PREFIX}_MACADDR
      eval ACTION='$'${PREFIX}_ACTION
      if [ $ACTION = 0 ]; then
        TARGET="DROP"
      else
        TARGET="RETURN"
      fi
      if [ -z $MACADDR ]; then
        $IPT -A $MODCHAIN -j $TARGET
        break
      else
        $IPT -A $MODCHAIN -m mac --mac-source $MACADDR -j $TARGET
      fi
    done
    $IPT -I PREROUTING -j $MODCHAIN
  done
}

del_chain() {
  for IT in $IT_LIST; do
    [ -x $IT ] || continue
    IPT="$IT -t mangle"
    $IPT -D PREROUTING -j $MODCHAIN
    $IPT -F $MODCHAIN
    $IPT -X $MODCHAIN
  done
}

case "$1" in
  start|restart)
    . /opt/$MODNAME/etc/settings
    if [ "$1" = "restart" ]; then
      echo -n "Restarting module $MODNAME: "
      del_chain 2>/dev/null
    else
      echo -n "Starting module $MODNAME: "
    fi
    if [ "$MOD_L2FW_ENABLED" != "1" ]; then
      echo "skipped"
      exit 0
    fi
    add_chain 2>/dev/null
    RETVAL=$?
    if [ $RETVAL = 0 ]; then echo "done"; else echo "failed"; fi
    exit $RETVAL
    ;;
  stop)
    echo -n "Stopping module $MODNAME: "
    del_chain 2>/dev/null
    RETVAL=$?
    if [ $RETVAL = 0 ]; then echo "done"; else echo "failed"; fi
    exit $RETVAL
    ;;
  status)
    for IT in $IT_LIST; do
      [ -x $IT ] || continue
      echo -n "Module $MODNAME, ${IT##*/} chain $MODCHAIN, is "
      CNT=`$IT -t mangle -nL | grep $MODCHAIN | awk 'END { print NR }'`
      if [ $CNT = 2 ]; then echo "running"; else echo "stopped"; fi
    done
    ;;
  defaults)
    cp /opt/$MODNAME/etc/defaults /opt/$MODNAME/etc/settings 2> /dev/null
    ;;
  *)
    echo "Usage: $0 {start|stop|restart|status|defaults}"
    exit 1
esac
